home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / CDC / CDCSRC.LZH / CDRC__.C < prev    next >
Text File  |  1995-03-20  |  7KB  |  252 lines

  1. #include    "_TNB.c"
  2. #define        UNchar        unsigned char
  3. #define        UNint        unsigned int
  4. extern    short    SCSI_ID;
  5. extern    short    CddevSw;        //0: SCSI直接 1:計測IOCTRL
  6. extern    short    CddDrvNo;        //計測IOCTRL用ドライヴNO
  7. /********************
  8.     常駐部
  9. *********************/
  10.  
  11. /*------------------------------*/
  12. /*    構造体            */
  13. /*------------------------------*/
  14. typedef struct {
  15.     int    fg;            /* 状態 0x11 演奏中,0x12 演奏中断 */
  16.     int    track_no;        /* 曲番号 */    /* 曲番号 ind*0x10000+track */
  17.     int    time;            /* 現在の演奏時間 */
  18.     int    address;        /* 演奏アドレス */
  19.     int    track_long;        /* 演奏中の曲のながさ*/
  20. } PLYINF;
  21.  
  22. /************************************** 
  23.       低レベルルーチン
  24. **************************************/
  25. /*******************************
  26.    REZEROUNITコマンドを送る
  27. ********************************/
  28. int ZeroUnit()
  29. {
  30. return( scsi_rezerounit(SCSI_ID) );
  31. }
  32. /*******************************
  33.    ストップコマンドを送る
  34. ********************************/
  35. int StpDsk()
  36. {
  37. static unsigned char com[]={0x4b,0,0,0,0, 0,0,0,0,0, 0};
  38. unsigned char buf[16];
  39. return( scsi_cmd( 10, com, 0, buf ) );
  40. }
  41. /*******************************
  42.     Resume コマンドを送る
  43. ********************************/
  44. int Resume()
  45. {
  46. static unsigned char com[]={0x4b,0,0,0,0, 0,0,0,1,0, 0};
  47. unsigned char buf[16];
  48. return( scsi_cmd( 10, com, 0, buf ) );
  49. }
  50. /********************************
  51.        演奏状態を調べる
  52. *********************************/
  53. int ChkPly( PLYINF *plyinf )
  54. {
  55. static unsigned char com[]={
  56.     /* Read Sub-Channel Command */
  57.         0x42,                    /* Read Sub-Channel Command */
  58.         0x02,                    /* Set MSF Bit */
  59.         0x40,                    /* Set SubQ Bit */
  60.         0x01,                    /* CD-ROM Current Posision */
  61.         0,
  62.         0,
  63.         0,
  64.         0,
  65.         16,                    /* Allocation Length */
  66.         0,
  67.         0
  68. };
  69. unsigned char buf[32];
  70. if ( CddevSw==0 ){    //0: SCSI直接 1:計測IOCTRL
  71.     if ( scsi_cmd( 10,com, 16, buf )!=0 )
  72.         return(-1);
  73.     plyinf->fg       = buf[1]&0x1F;        /* 状態 */
  74.     plyinf->track_no = buf[6] + buf[7]*0x10000;    /* 曲番号 ind*0x10000+track */
  75.     plyinf->time     = buf[13] * 0x10000 + buf[14] * 0x100 + buf[15];
  76.     plyinf->address  = buf[9]  * 0x10000 + buf[10] * 0x100 + buf[11];
  77. } else {
  78.     cdd_ioctrl(0x8004,buf);
  79.     if ( buf[0]==0 && buf[1]==0 )/*CD入っていないらしい*/
  80.         return(-1);
  81.     else if ( buf[0]==0 && buf[1]==1 )
  82.         plyinf->fg = 0x11;
  83.     else if ( buf[0]==1 && buf[1]==1 && buf[2]==1 && buf[4]!=0 && buf[5]!=0 )
  84.         plyinf->fg = 0x12;
  85.     else
  86.         plyinf->fg = 0x15;
  87.     plyinf->track_no = buf[2] + buf[3]*0x10000;    /* 曲番号 ind*0x10000+track */
  88.     plyinf->time     = buf[4] * 0x10000 + buf[5] * 0x100 + buf[6];
  89.     plyinf->address  = buf[8] * 0x10000 + buf[9] * 0x100 + buf[10];
  90. }
  91. return(0);
  92. }
  93. /*********************************
  94.     演奏させる
  95. *********************************/
  96. int PlyDsk( int start , int stop )
  97. {
  98. /* Play Audio MSF  Command */
  99. unsigned char buf[32];
  100. if ( CddevSw==0 ){    //0: SCSI直接 1:計測IOCTRL
  101.     buf[0] = 0x47;                /* Play Audio MSF Command */
  102.     buf[1]=0;
  103.     buf[2]=0;
  104.     buf[3] = ( start / 0x10000 ) & 0xff;
  105.     buf[4] = ( start / 0x100 ) & 0xff;
  106.     buf[5] = start & 0xff;
  107.     buf[6] = ( stop / 0x10000 ) & 0xff;
  108.     buf[7] = ( stop / 0x100 ) & 0xff;
  109.     buf[8] = stop & 0xff;
  110.     buf[9]=0;
  111.     return( scsi_cmd( 10, buf, 0, buf ) );
  112. } else {
  113.     buf[0] = ( start / 0x10000 ) & 0xff;
  114.     buf[1] = ( start / 0x100 ) & 0xff;
  115.     buf[2] = start & 0xff;
  116.     buf[3] = 0;
  117.     buf[4] = ( stop / 0x10000 ) & 0xff;
  118.     buf[5] = ( stop / 0x100 ) & 0xff;
  119.     buf[6] = stop & 0xff;
  120.     buf[7] = 0;
  121.     cdd_ioctrl(0x8001,buf);
  122.     return( 0 );
  123. }
  124. }
  125. /***********************************
  126.   曲数と最終演奏アドレスを求める
  127. ************************************/
  128. int RedTOC(int *leadout_address, int *min_, int *max_)
  129. {
  130. static unsigned char    com[]={
  131.     /* Leadout Track Address get & Min. Max Track get */
  132.         0x43,                    /* scsi2 ReadTOC Command */
  133.         0x02,                    /* Set MSF Bit */
  134.         0,
  135.         0,
  136.         0,
  137.         0,
  138.         0xaa,                    /* LeadoutOut Track */
  139.         0,
  140.         12,                    /* Allocation Length */
  141.         0
  142. };
  143. unsigned char buf[512];//足りるはず
  144. if ( CddevSw==0 ){    //0: SCSI直接 1:計測IOCTRL
  145.     if( scsi_cmd( 10, com, 12, buf )!=0 )
  146.         return(-1);
  147.     *leadout_address = buf[9] * 0x10000 + buf[10] * 0x100 + buf[11];
  148.     *min_ = buf[2];                /* Min. Track */
  149.     *max_ = buf[3];                /* Max. Track */
  150. } else {
  151.     cdd_ioctrl(0x8000,buf);
  152.     *leadout_address = buf[2] * 0x10000 + buf[3] * 0x100 + buf[4];
  153.     *min_ = buf[0];                /* Min. Track */
  154.     *max_ = buf[1];                /* Max. Track */
  155. }
  156. return(0);
  157. }
  158. /*************************************
  159.     演奏アドレスを求める
  160. ***************************************/
  161. int Music_inf( int Track_no, int *start_address )
  162. {
  163. int    rc,i;
  164. static unsigned char    com[]={
  165.     /* Start Track Address  get */
  166.         0x43,                    /* scsi2 ReadTOC Command */
  167.         0x02,                    /* Set MSF Bit */
  168.         0,
  169.         0,
  170.         0,
  171.         0,
  172.          00,                    /* Set Start Track */
  173.         0,
  174.         12,                    /* Allocation Length */
  175.         0
  176. };
  177. unsigned char buf[512];    //足りるはず
  178. if ( CddevSw==0 ){    //0: SCSI直接 1:計測IOCTRL
  179.     com[6] = (UNchar)Track_no;        /* Set Start Track */
  180.     if( scsi_cmd( 10, com, 12, buf ) != 0 )
  181.         return(-1);
  182.     *start_address = buf[9] * 0x10000 + buf[10] * 0x100 + buf[11];
  183.     if ( (buf[5]&0b0100)!=0 )//データだ
  184.         *(UNint*)start_address |= (UNint)0x80000000;
  185. } else {
  186.     cdd_ioctrl(0x8000,buf);
  187.     i=(Track_no-1)*4+6;
  188.     *start_address = buf[i] * 0x10000 + buf[i+1] * 0x100 + buf[i+2];
  189.     if ( buf[i+3]!=0 )//データだ
  190.         *(UNint*)start_address |= (UNint)0x80000000;
  191. }
  192. return(0);
  193. }
  194. /*++++++++++*/
  195. int Music_inf_all( int min,int max,int *lst ) //int buf[100];
  196. {
  197. int    rc,i,t;
  198. unsigned char buf[512];    //足りるはず
  199. if ( CddevSw==0 ){    //0: SCSI直接 1:計測IOCTRL
  200.     for(t=min;t<=max;t++){
  201.         if ( Music_inf( t,&lst[t] )!=0 )
  202.             return(-1);
  203.     }
  204. } else {
  205.     cdd_ioctrl(0x8000,buf);
  206.     for(t=min;t<=max;t++){
  207.         i=(t-1)*4+6;
  208.         lst[t]= buf[i] * 0x10000 + buf[i+1] * 0x100 + buf[i+2];
  209.         if ( buf[i+3]!=0 )//データだ
  210.             (UNint)lst[t] |= (UNint)0x80000000;
  211.     }
  212. }
  213. return(0);
  214. }
  215. /*************************************
  216.     CD-ROM接続チェック
  217. [戻り値] 0:OK
  218.     -1:
  219. ***************************************/
  220. int    CDROM_chk()
  221. {
  222. int    i;
  223. unsigned char buf[100];
  224. /* 装置動作可能かチェックする */
  225. /* メディアチェック */
  226. if( scsi_inquiry( 0x24, SCSI_ID, (struct _inquiry *)buf ) == 0 ){
  227.     if( buf[0] != 0x05 ){
  228.         //puts("指定された SCSI-ID の装置は、CD-ROM ではない。\n\r");
  229.         return(-1);
  230.     }
  231.     /* 装置動作可能かチェック */
  232.     if( scsi_testunit(SCSI_ID) == 0 ){
  233.         //puts("OK! 1\n\r");
  234.         return(0);
  235.     } else
  236.     if( scsi_testunit(SCSI_ID) == 0 ){
  237.         //puts("OK! 2\n\r");
  238.         return(0);
  239.     } else
  240.     if( scsi_testunit(SCSI_ID) == 0 ){
  241.         //puts("OK! 3\n\r");
  242.         return(0);
  243.     } else
  244.     {
  245.         //puts("指定された CD-ROM が準備されていません。\n\r");
  246.         return(-2);
  247.     }
  248. }
  249. //puts("指定された SCSI-ID の装置は、現在動作不可能です。\n\r");
  250. return(-3);
  251. }
  252.